我们考虑建图,把每个点拆开,若两个数和为平方数,那么就从编号小的向编号大的连权值为$1$的有向边。那么就把这个问题转换成了最大匹配问题。
然后我们考虑对于一个新的球,如果能找到原来在的一个球能够匹配,那么可以直接匹配,否则就需要新开一根柱子。所以我们从小到大枚举放的球数,每次加入一个球,直到柱子个数超过给定的上限,那么上一次就是能放的最多球数。
对于方案,我们为了方便,在新增一根柱子的时候记录这个需要新柱子的球的编号,其余路径就按网络流跑二分图匹配的路径记录搞一搞即可。
代码
1 |
|
我们考虑建图,把每个点拆开,若两个数和为平方数,那么就从编号小的向编号大的连权值为$1$的有向边。那么就把这个问题转换成了最大匹配问题。
然后我们考虑对于一个新的球,如果能找到原来在的一个球能够匹配,那么可以直接匹配,否则就需要新开一根柱子。所以我们从小到大枚举放的球数,每次加入一个球,直到柱子个数超过给定的上限,那么上一次就是能放的最多球数。
对于方案,我们为了方便,在新增一根柱子的时候记录这个需要新柱子的球的编号,其余路径就按网络流跑二分图匹配的路径记录搞一搞即可。
代码
1 | #include <bits/stdc++.h> |